<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of sayHello
 *
 * @author sonia
 */
class encolaMailingTask extends sfBaseTask
{
  public function configure()
  {
    $this->namespace = 'encola';
    $this->name      = 'mailing';
    
    $this->addOptions(array(
    new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'frontend'),
    new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
  ));
  }
 
  private function verificaremail($email){ 
    if (!ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$email)){ 
      return FALSE; 
    } else { 
       return TRUE; 
    } 
  } 
  
  public function execute($arguments = array(), $options = array())
  {
      // incrementamos el limite de ejecucion para este script
      ini_set('max_execution_time', 600);
      // Y no ponemos límite a la memoria
      ini_set('memory_limit', '-1');
      $today = date("Y-m-d"); 
      $databaseManager = new sfDatabaseManager($this->configuration);
      //$connection = $databaseManager->getDatabase()->getConnection();
      
      //Obtenemos los mailings que deben enviarse hoy y no se han enviado aún.
      $mailings = Doctrine_Query::create()
                        ->from('Mailing n1')
                        ->where('n1.fecha_lanzamiento = ?',$today)
                        ->andWhere('n1.is_validated != 1') //No hace falta puesto que no los mando de forma inmediata
                        ->execute();
      
      $from = sfConfig::get('app_email_remiteMail');
      $nombre = sfConfig::get('app_email_remiteNombre');
      
      //Obtenemos el pie y el logotipo del envío
      //$imagen = sfConfig::get('app_email_logotipo');
      //$cabecera = "<div><img src=\"".$imagen."\" alt=\"Logotipo\" /></div>";     
      $nombre_fichero = sfConfig::get('app_email_fichfirma2');
      $fichero_texto = fopen ($nombre_fichero, "r");
      //obtenemos de una sola vez todo el contenido del fichero
      //OJO! Debido a filesize(), sólo funcionará con archivos de texto
      $pie = fread($fichero_texto, filesize($nombre_fichero));
      $novalidos = NULL;
      
      foreach ($mailings as $mailing){       
            //Cojo los destinatarios
            $grupo = $mailing->getGrupo();
            // Si no es un grupo del sistema cojo los contactos a través de la tabla intermedia
            if (!$grupo->is_validated){
                $contactos = $grupo->getContactos();                
            }
            else { // Si no, los cojo mirando su idioma
                if ($grupo->getNombre() == "sinidioma" ){
                    $contactos = Doctrine::getTable('Contacto')
                                ->createQuery('c1')
                                ->where('c1.idioma IS NULL OR c1.idioma LIKE 0')
                                ->execute();
                }
                elseif ($grupo->getNombre() == "español y sin idioma" ){
                    $idioma = "español";
                    $contactos = Doctrine::getTable('Contacto')
                                ->createQuery('c1')
                                ->where('c1.idioma IS NULL')
                                ->orWhere('c1.idioma = ?', $idioma)
                                ->orWhere('c1.idioma LIKE 0')
                                ->execute();
                }
                else{
                    $contactos = Doctrine::getTable('Contacto')
                                ->createQuery('c1')
                                ->where('c1.idioma = ?',$grupo->getNombre())
                                ->execute();                
                }     
            }
            // Creo un mensaje nuevo para cada contacto (para poder poner límite al envío).
            foreach ($contactos as $contacto){
                //Incluyo solo el email y no el nombre en un array asociativo, puesto que este puede repetirse.
                //Si el usuario tiene email y autoriza el envío de mailing
                $email = trim($contacto->getEmail());
                if ((($email != NULL)||($email != "")) && 
                    (($contacto->getAutoriza()) || ($contacto->getAutoriza() == NULL))){
                    if ($this->verificaremail($email)){
                        $to = $contacto->getEmail();            
                        $toNombre = $contacto->getNombre()." ".$contacto->getPrimerApellido();
                    
                        $subject = $mailing->getAsunto();
                    
                    /* Establezco la vble idioma en función del idioma del cliente,
                        * lo hago así para evitar errores por escribirlo de distinta manera (Mayúsculas, tildes, etc).
                        */
                        $idioma = strtoupper($contacto->getIdioma());                   
                        if ($idioma == "INGLéS"){                        
                            $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_EN');
                        }
                        else if ($idioma == "SUECO") {                        
                            $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_SW');
                        }
                        else{ //Si no hay idioma, considero el español por defecto                        
                            $nombre_fichero_lopd = sfConfig::get('app_email_fichpie2_ES');
                        }

                        $fichero_lopd = fopen ($nombre_fichero_lopd, "r");      
                        //obtenemos de una sola vez todo el contenido del fichero
                        //OJO! Debido a filesize(), sólo funcionará con archivos de texto                
                        $lopd = fread($fichero_lopd, filesize($nombre_fichero_lopd));            

                        //Añadimos el pie y el logotipo al envío
                        //$text = $cabecera.$mailing->getTexto().$pie.$lopd;
                        $text = $mailing->getTexto().$pie.$lopd;

                        // Reemplazamos los comodines en el texto
                        $text = str_replace("%nombre%", $contacto->getNombre(), $text);
                        $text = str_replace("%primer_apellido%", $contacto->getPrimerApellido(), $text);
                        $text = str_replace("%segundo_apellido%", $contacto->getSegundoApellido(), $text);
                        $text = str_replace("%sexo%", $contacto->getSexo(), $text);
                        $text = str_replace("%dni%", $contacto->getNumDocumento(), $text);
                        $text = str_replace("%fecha_nacimiento%", $contacto->getFechaNac(), $text);
                        $text = str_replace("%idioma%", $contacto->getIdioma(), $text);                                        

                        //Creo el mailer con los datos
                        $message = $this->getMailer()->compose();
                        $message->setSubject($subject);            
                        $message->setTo(array ($to => $toNombre));
                        $message->setFrom(array ($from => $nombre));
                        $message->setBody($text, 'text/html');  

                        // Añado los adjuntos si existen.
                        if ($mailing->getAdjunto1()!= NULL){
                            $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments2').$mailing->getAdjunto1())
                                    ->setFileName($mailing->getAdjuntoOriginal1())); //cambiamos el nombre del adjunto. VER CUAL PONER, ANALISIS!!!
                        }
                        if ($mailing->getAdjunto2()!= NULL){
                            $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments2').$mailing->getAdjunto2())
                                ->setFileName($mailing->getAdjuntoOriginal2()));
                        }

                        //Lo encolamos.            
                        $this->getMailer()->send($message); 
                    }
                    else { //Lo encolo en una lista de emails no válidos
                        $novalidos = $novalidos . " " . $email;
                    }
                }                 
            }
            // Creo un email para enviar los correos que no son validos si los hay.
            if ($novalidos != NULL){
                $to = sfConfig::get('app_email_remiteMail');            
                $subject = "Direcciones NO Validas";
                $text = "Las direcciones siguientes no están bien formadas y, ".
                        "por tanto no se ha enviado el mailing a sus propietarios: " . $novalidos;
                //Creo el mailer con los datos
                $message = $this->getMailer()->compose();
                $message->setSubject($subject);            
                $message->setTo(array ($to => $nombre));
                $message->setFrom(array ($from => $nombre));
                $message->setBody($text);
                $this->getMailer()->send($message); 
            }
            //Lo marcamos como enviado (aunque realmente aún no se ha enviado)
            $mailing->is_validated= TRUE;            
            $mailing->save(); 
      } 
  }
}

?>
